/******* 平台公共方法 *******/



function timeFormat(time) {
    let newTime = new Date(time);
    console.log(newTime);
    let year = newTime.getFullYear();
    let month = newTime.getMonth() + 1;
    let day = newTime.getDate();
    let hour = newTime.getHours();
    let minutes = newTime.getMinutes();
    let seconds = newTime.getSeconds();
    if(month < 10){
        month = '0' + month;
    }
    if(day < 10){
        day = '0' + day;
    }
    if(hour < 10){
        hour = '0' + hour;
    }
    if(minutes < 10){
        minutes = '0' + minutes;
    }
    if(seconds < 10){
        seconds = '0' + seconds;
    }
    return year + "-" + month + "-" + day  + " " + hour + ":" + minutes + ":" + seconds;
}


 /**
 * 获得正在显示的中间主内容区
 * @returns {*}
 */
function getShowPane(){
    return $('.content-wrapper>div.show')[0];
};

/**
 * 获得正在显示的面包削节点
 * @returns {*}
 */
function getShowMianBao(){
    return $(getShowPane()).find('ol.breadcrumb>li.active')[0];
};

/**
 * 获得正在显示的菜单栏节点
 * @returns {*}
 */
function getShowMenu(){
    // let name = $(getShowPane()).attr('data-name');
    return $('ul.menu-content>li.active')[0];
};

/**
 * 获得正在显示的导航栏节点
 * @returns {*}
 */
function getShowNav(){
    let name = $(getShowPane()).attr('data-name');
    return $('a[aria-controls="pills-'+name+'"].active').closest('li')[0];
};

/**
 * 获得正在显示的 hash 字符串
 * @returns {string}
 */
function getHash(){
    return window.document.location.hash.toString().substring(window.document.location.hash.toString().indexOf('/')+1,window.document.location.hash.toString().length);
};

/******* 平台公共方法 *******/

// 初始化临时数据的匿名函数
(function initData(staticData) {

    // 私有属性
    const methodName = Symbol('method');
    const gddData = Symbol('xuetang9_dt_gdd');

    // 给 $ 上添加我们的临时数据 - 类似懒汉单例获取方式
    $.getGDD = function(key) {
        // 如果没有传入 key
        if(key === undefined){
            // 判断 方式是否被创建，如果没有则创建对象给 $ 上，用于这个方法的获取单例
            if ($[gddData] === undefined) {
                $[gddData] = new staticData('obj');
            };

            // 存在则直接返回 $
            // 返回该方法至调用者
            return $[gddData];
        }
        // 如果输入 key 则返回主键对应的名称
        let obj = $.getGDD().select(key);
        if(obj == null ){
            return undefined;
        }
        return obj.value;
    };

    // 设置键值对
    $.addGDD = function(key,value){
        if(key === undefined || value === undefined){
            return;
        }

        let v = value || {};
        $.getGDD().add(key,v);
    };

    /**********************************/

    // 给 $ 上添加我们的临时数据 - 类似懒汉单例获取方式
    $.getMenuData = function(key) {
        // 如果没有传入 key
        if(key === undefined){
            // 判断 方式是否被创建，如果没有则创建对象给 $ 上，用于这个方法的获取单例
            if ($[methodName] === undefined) {
                $[methodName] = new staticData('menu');
            };

            // 存在则直接返回 $
            // 返回该方法至调用者
            return $[methodName];
        }
        // 如果输入 key 则返回主键对应的名称
        return $.getMenuData().select(key);
    };

    // 设置键值对
    $.addMenuData = function(key,value){
        if(key === undefined || value === undefined){
            return;
        }

        let v = value || {};
        $.getMenuData().add(key,v);
    };

})(
    class staticData {
        // 构造方法，创建时自动触发
        constructor(type) {
            // 设置类型
            this.type = type;
            if(type === undefined){
                throw new Error("工厂 staticData 需要设置工厂类型");
            }

            // key为 点击的菜单 data-aName 触发事件的名称
            // value
            // 如果是字符串则会当成 href 地址注入
            // 如果是方法 则会触发该方法的调用
            // 方法的话，会传入参数，1 中间的 div 对象，相关的导航栏对象，和菜单栏对象，和面包削对象
            // 然后获取一个用于 ajax 的对象
            this.length = -1;

            switch (type) {
            case "menu":
                this.head = new Menu('',{},{});
                break;
            case "obj":
                this.head = new Obj('',{},{});
                break;
            default :
                throw new Error("工厂 staticData 暂不支持此类型");
                break;
            }

            this.tail = undefined;

            // 标签和触发的方法
        };

        add(key,value) {
            // 判断 key 是否存在
            if(this.select(key)){
                throw new Error('[' + key + '] 的 key 已存在！');
            }

            // 传入 键值 创建一个菜单对象
            let tempTable;

            // 判断类型去创建对象
            switch (this.type) {
            case "menu":
                tempTable = new Menu(key,value);
                break;
            case "obj":
                tempTable = new Obj(key,value);
                break;
            }

            // 如果数据头的下个节点 = undefined, 代表没有数据
            if(this.head.next === undefined){
                this.head.next = tempTable;
            }else{
                this.tail.next = tempTable;
            }

            //
            tempTable.last = this.tail;
            this.tail = tempTable;

            // 将现在的这个对象设置为新的尾部
            this.length ++;
            console.log(this);
        };

        // 根据主键查找
        select(key){
            // 如果长度为 -1 则直接返回
            if(length === -1){
                return null;
            }

            let temp = this.head.next;
            for(let i = 0; i <= this.length; i++){
                if(temp.key === key){
                    return temp;
                }
                temp = temp.next;
            }
            return null;
        };
    }
);

// 用来映射 菜单栏相关方法的模型对象
class Menu{
    constructor(key,value) {
        // 给上面结构使用
        this.last = undefined;
        this.next = undefined;

        this.key = key || null;

        // 对 value 变量类型进行筛选判断
        let type = typeof value;

        // 如果是 string 类型则认为是 url 直接 load 注入
        if( type === 'string' ){
        }else if(type === 'function'){
        }else if(type === 'object'){
        }else{
            throw new extend("传入的 value 只能是 string function 和 object 类型");
        }

        this.value = value || null;
    };

    start(node){
        let type = typeof this.value;
        // console.log(type);
        // console.log(this.value);
        if( type === 'string' ){
            $(node).load(this.value);
        }else if(type === 'function'){
            this.value(this.key,node);
        }else if( this.type === 'object'){
            $.ajax(this.value);
        }
    }
}

class Obj{
    constructor(key,value) {
        // 给上面结构使用
        this.last = undefined;
        this.next = undefined;

        this.key = key || null;

        // 对 value 变量类型进行筛选判断
        let type = typeof value;

        // 如果是 string 类型则认为是 url 直接 load 注入
        if( type === 'string' ){
        }else if(type === 'function'){
        }else if(type === 'object'){
        }else{
            throw new error("传入的 value 只能是 string function 和 object 类型");
        }

        this.value = value || null;
    };

}


/*******  *******/

// 初始化导航栏右上角相关功能监听的匿名函数
(function () {
    /**
     *	关闭当前标签的监听
     */
    $('#closeThisNav').on('click',function () {
        // 依赖于 chcha 的自定义方法
        let navNode = $(getShowNav()).find('button');
        chacha.call(navNode);
    });

    /**
     * 关闭其他标签的监听
     */
    $('#closeElseNav').on('click',function () {
        let liArray = $('ul#pills-tab').find('li');
        for (let temp of liArray){
            if(!$(temp).find('a').hasClass('active')
                && $(temp).find('button').length > 0){

                let id = $(temp).find('a').attr('aria-controls');
                $('#'+id).remove();
                temp.remove();
            }
        }
    });

    /**
     * 关闭所有标签的监听
     */
    $('#closeAllNav').on('click',function () {
        let liArray = $('ul#pills-tab').find('li');
        for (let temp of liArray){
            if($(temp).find('button').length > 0){
                // let navNode = $(temp).find('button');
                let id = $(temp).find('a').attr('aria-controls');
                $('#'+id).remove();
                temp.remove();
            }else{
                $(getShowNav()).removeClass('active');
                $(temp).find('a').addClass('active');
            }
        }

        // 最后将菜单栏更新
        // 关闭正在显示的菜单栏标签
        $(getShowMenu()).removeClass('active');
        // 获取正在显示的导航栏标签的id
        let id = $('#pills-tab>li.nav-item>a.active').closest('li')[0].id;
        // 将对应的菜单栏标签设为显示
        $('a[data-aname='+id+']').addClass('active');
    });

    // 刷新当前页面的监听
    $('#refreshThisNav').on('click',function (ev) {
        let id = getShowNav().id;

        // 将当前页面的面包进行格式化
        // 触发面包的监听器
        $($(getShowMianBao()).closest('ol').find('a[bind='+id+']')[0]).trigger('click')

        // 将没必要的部分删除掉，并将目前显示的设置为对应的名称
        $(getShowPane()).closest('div.show[data-name='+id+']').find(id).each(function (index,node) {
            if(index === 0){
                $(this).css('display','block');
                $(this).attr('data-id',id);
            }else{
                $(this).remove();
            }
        });

        // 触发刷新数据的方法
        $.getMenuData(id).start($(getShowPane()).find(id));

    });

    // 刷新所有页面的监听
    $('#refreshAllNav').on('click',function (ev) {

        // 获得所有显示的导航栏
        $('#pills-tab li[id]').each(function () {

            let id = this.id;
            // 根据id 查询 bind = "" 的a 标签, 并触发他的监听，清除后面的面包
            $('a[bind="'+id+'"').trigger('click');

            // 与刷新单个标签的思路相同，将不显示的删除掉，只保留一个名字和父级相等的 data-id 名称
            $(id).each(function (index,node) {
                if(index === 0){
                    $(this).css('display','block');
                    $(this).attr('data-id',id);
                }else{
                    $(this).remove();
                }
            });

            // 触发刷新的时间
            let temp = $.getMenuData(this.id);
            if(temp !== null){
                temp.start($(this.id));
            }

        });

    });

    /**
     * 标签绑定的叉叉按钮 事件
     * @param {Object} this1 this 自身传过来了
     */
    function chacha() {
        // 情况1：当点击叉的标签不在显示时候，则直接关闭相关的内容和导航
        // 情况2：点击的正在显示，位置不在最后一个，则关闭自身相关后，将显示设置为尾部导航
        // 情况3：如果自身显示，并且又在最后一个位置，则关闭自身后将前一个导航设置为显示

        // 找到绑定的 li 标签
        let biaoQian = $(this).closest('li')[0];
        let aNode = $(this).closest('a')[0];

        // 根据绑定的 li 自定义属性 找到对应的内容 div
        let id = aNode.getAttribute('aria-controls');
        let neiRong = $('#' + id)[0];

        // 如果不是自身节点显示，则直接移除点击的标签
        let isBoo = $(aNode).hasClass('active');
        if (!isBoo) {
            $(biaoQian).remove();
            $(neiRong).remove();
            return false;
        }

        // 如果点击的不是最后一个节点，并且自身显示
        // 则将显示赋予给尾部，将自身移除
        if ($(biaoQian).next().length > 0) {
            // 判断自身是不是显示的节点
            // console.log('2')

            // 将找到兄弟节点的最后一个
            let node;
            let temp = $(biaoQian);
            do {
                node = temp[0];
                temp = $(temp).next();
                console.log(temp[0])
            } while (temp[0]);

            // 先将 最后的节点置为 active，然后将需要移除的标签移除掉
            console.log(node);
            $(node).children().addClass('active');
            $(biaoQian).remove();
            $(neiRong).remove();

            // 最后获取要最后节点绑定的 内容 div 赋予 show active 类样式
            aNode = $(node).children()[0];
            id = aNode.getAttribute('aria-controls')
            neiRong = $('#' + id)[0];
            $(neiRong).addClass('show active');

            // 如果是最后一个节点 并且自身显示
            // 则将自身移除并把前一个节点置为显示
        } else {

            // 找到标签的上一个节点里的 a 标签然后赋予 active 类样式，回退两次回到自身 remove 移除掉
            $(biaoQian).prev().children().addClass('active').end().end().remove();
            // 找到自身标签的上一个内容 赋予 'show active' 类样式，在回退将自身移除
            $(neiRong).prev().addClass('show active').end().remove();

        }

        // 在 active 是自己时chacha 切换锚记
        hash();

        // 移除过后根据当前显示的导航栏，将菜单栏进行更新
        $(getShowMenu()).removeClass('active');
        let name = getShowNav().id;
        $('a[data-aname="'+name+'"]').closest('li').addClass('active');

    }

    /**
     * 切换 window 网页 href 上的尾部 hash 锚记
     */
    function hash(){
        // 获取到中间正在显示的内容面板的节点 content-wrapper
        let div = getShowPane();
        // 获取对应的 data-name 自定义属性
        let dataName = div.getAttribute('data-name');
        // 将自定义属性的内容设置为网址 hash 锚记上
        window.document.location.hash = dataName;
    }
})();

// 对皮肤管控的匿名函数相关代码
(function (refreshSkin, saveSkin) {
    // 界面皮肤的初始化加载过程
    window.setTimeout(function () {

        $.get('skin','',function (res) {
            refreshSkin(res);
        },'json');

    },2000);

    // 给刷新界面的按钮添加监听
    $('#gdd-refreshSkin').on('click',function () {
        refreshSkin();
    });

    // 给保存界面的按钮添加监听
    $('#gdd-saveSkin').on('click',function () {
        saveSkin();
    });

    // 给皮肤区域补充监听器
    $('#bgImgUrl').on('click',function () {
        // console.log('点了图片区');
        // 判断复选框
        if(!$('#sidebar-bg-img')[0].checked){
            $('#sidebar-bg-img')[0].checked = !$('#sidebar-bg-img')[0].checked;
        }
    });
})(/**
     *  刷新当前皮肤的方法
     */
    function refreshSkin(vo){
        console.log('刷新当前皮肤的方法');
        let skinVO = {};

        if(vo === undefined){
            console.log('vo === undefined 进来了吗');

            $.ajax({
                url : 'skin',
                dataType : 'json',
                async : false,
                success : function (res) {
                    console.log(res);
                    skinVO = res;
                }
            });

        }else{
            skinVO = vo;
        }

        // 判断背景主题是否为空
        if(skinVO['bgSubject'] !== null){
            // 1. 无 layout-dark 白色
            // 2. 有 layout-dark 透明色
            // 3. 有 layout-dark 黑色

            let bgSubject = skinVO['bgSubject'];

            // 如果是白色 则直接触发监听
            // 如果是透明色 则直接触发监听
            // 如果是黑色则 判断是否存在 类 样式
            // 存在则不触发任务
            if(bgSubject === 'dl-switch'){
                if(!$('#'+skinVO['bgSubject'])[0].checked || !$('body').hasClass('layout-dark')){
                    $('#'+skinVO['bgSubject']).trigger('click');
                }
            }else{
                $('#'+skinVO['bgSubject']).trigger('click');

            }

            if($('body').hasClass('layout-dark')){
                let temp = skinVO['bgSubject'];
            }else{
                $('#'+skinVO['bgSubject']).trigger('click');
            }

            // 如果是透明背景则加载
            if(skinVO['bgSubject'] === 'tl-switch'){

                // 如果透明背景主题渲染存在
                if(skinVO['bgSubjectRenderer'] !== null){
                    // 获取参数
                    let temp = skinVO['bgSubjectRenderer'];
                    // 找到元素的子节点
                    $('#bgXuanRan').find('img[data-id]').each(function () {
                        // 如果参数和遍历的 data-id 属性相同则触发监听
                        if(temp === $(this).attr('data-id')){
                            $(this).addClass('selected');
                            $(this).trigger('click');
                        }else{
                            // 不相同的设置为不选中
                            $(this).removeClass('selected');
                        }
                    });

                    // 如果透明背景主题颜色存在
                }else if(skinVO['bgSubjectColor'] !== null){

                    let temp = skinVO['bgSubjectColor'];
                    $('#bgColor').find('span[data-bg-color]').each(function () {
                        if(temp === $(this).attr('data-bg-color')){
                            $(this).addClass('selected');
                            $(this).trigger('click');
                        }else{
                            $(this).removeClass('selected');
                        }
                    });
                }

            }else{

                // 判断背景菜单颜色
                if(skinVO['bgMenuColor'] !== null){
                    let temp = skinVO['bgMenuColor'];

                    $('#skin-color').find('span[data-bg-color]').each(function () {
                        if(temp === $(this).attr('data-bg-color')){
                            $(this).addClass('selected');
                            $(this).trigger('click');
                        }else{
                            $(this).removeClass('selected');
                        }
                    });

                }

                // 背景图片开关
                if(skinVO['bgImgSwitch'] !== null){

                    let thisSwitch = $('#sidebar-bg-img')[0].checked;
                    let tempSwitch = skinVO['bgImgSwitch'];

                    console.log("本地开关："+thisSwitch);
                    console.log("数据开关："+tempSwitch);

                    if(thisSwitch !== tempSwitch){
                        $('#sidebar-bg-img').trigger('click');
                    }

                    // 判断背景图片地址
                    if($('#sidebar-bg-img')[0].checked && skinVO['bgImgUrl'] !== null){
                        let temp = skinVO['bgImgUrl'];

                        $('#bgImgUrl').find('img[data-id]').each(function () {
                            if(temp === $(this).attr('data-id')){
                                $(this).addClass('selected');
                                $(this).trigger('click');
                            }else{
                                $(this).removeClass('selected');
                            }
                        });

                    }
                }
            }
        }

        // 背景简约菜单开关
        if(skinVO['bgSimplifyMenu'] !== null){

            let thisSwitch = $('#cz-compact-menu')[0].checked;
            let tempSwitch = skinVO['bgSimplifyMenu'];

            if(thisSwitch !== tempSwitch){
                $('#cz-compact-menu').trigger('click');
            }
        }

        // 背景菜单宽度的设置
        if(skinVO['bgMenuWidth'] !== null){
            // console.log(skinVO['bgMenuWidth']);
            let temp = skinVO['bgMenuWidth'];
            console.log(temp);

            let node = $('#cz-sidebar-width option[value="'+temp+'"]');
            console.log(node);

            if(!node[0].selected){
                // 如果是 false 则将之前显示的 selected 的清楚掉
                $('#cz-sidebar-width').find('option').each(function () {
                    if(this.value === skinVO['bgMenuWidth']){
                        this.selected = true;
                    }else{
                        this.selected = false;
                    }
                });

                let target = $('#gdd-body');
                target.removeClass('sidebar-lg');
                target.removeClass('sidebar-sm');

                switch (temp) {
                    case "small":
                        target.addClass('sidebar-sm');
                        break;
                    case "medium":
                        // 标准长度无需修改
                        break;
                    case "large":
                        target.addClass('sidebar-lg');
                        break;
                }
            }
        }

        console.log(skinVO);
    },
    /**
     * 保存当前皮肤配置的方法
     */
    function saveSkin() {
        // 初始化
        let skinVO = {};

        // bgImgSwitch: true
        // bgImgUrl: "sb-bg-01"
        // bgMenuColor: "success"
        // bgMenuWidth: "medium"
        // bgSimplifyMenu: true
        // bgSubject: "ll-switch"
        // bgSubjectColor: null
        // bgSubjectRenderer: null

        $('#bg-buju').find('input[name="layout-switch"]').each(function () {
            if(this.checked){
                skinVO['bgSubject'] = this.id;
                // console.log(this.id);

                skinVO['bgImgSwitch'] = $('#sidebar-bg-img')[0].checked;
                skinVO['bgSimplifyMenu'] = $('#cz-compact-menu')[0].checked;

                // 如果是透明背景则加载
                if(skinVO['bgSubject'] === 'tl-switch'){
                    $('#bgXuanRan').find('img').each(function () {
                        if($(this).hasClass('selected')){
                            let temp = $(this).attr('data-id');
                            skinVO['bgSubjectRenderer'] = temp;
                            // console.log(temp);
                            return false;
                        }
                    });

                    $('#bgColor').find('span').each(function () {
                        if($(this).hasClass('selected')){
                            let temp = $(this).attr('data-bg-color');
                            skinVO['bgSubjectColor'] = temp;
                            // console.log(temp);
                            return false;
                        }
                    });
                }else{
                    $('#skin-color').find('span').each(function () {
                        if($(this).hasClass('selected')){
                            let temp = $(this).attr('data-bg-color');
                            skinVO['bgMenuColor'] = temp;
                            // console.log(temp);
                            return false;
                        }
                    });

                    if(!skinVO['bgImgSwitch'] || skinVO['bgImgSwitch'] === null){
                        return false;
                    }

                    $('#bgImgUrl').find('img').each(function () {
                        if($(this).hasClass('selected')){
                            let temp = $(this).attr('data-id');
                            skinVO['bgImgUrl'] = temp;
                            // console.log(temp);
                            return false;
                        }
                    });
                }

                return false;
            };
        });

        $('#cz-sidebar-width').find('option').each(function () {
            // console.log(this.selected)
            if(this.selected){
                console.log($(this).attr('value'));
                skinVO['bgMenuWidth'] = $(this).attr('value');
                return false;
            };

        });

        console.log(skinVO);

        // 向服务器发送存储请求
        $.post('skin',skinVO,function (res) {
            console.log(res);
        });

    });

function timeFormat(time) {
    let newTime = new Date(time);
    console.log(newTime);
    let year = newTime.getFullYear();
    let month = newTime.getMonth() + 1;
    let day = newTime.getDate();
    let hour = newTime.getHours();
    let minutes = newTime.getMinutes();
    let seconds = newTime.getSeconds();
    if(month < 10){
        month = '0' + month;
    }
    if(day < 10){
        day = '0' + day;
    }
    if(hour < 10){
        hour = '0' + hour;
    }
    if(minutes < 10){
        minutes = '0' + minutes;
    }
    if(seconds < 10){
        seconds = '0' + seconds;
    }
    return year + "-" + month + "-" + day  + " " + hour + ":" + minutes + ":" + seconds;
}
